// http.js
import axios from 'axios'
import { tansParams } from '@/utils/method'
// 创建 axios 实例

const errorCode = {
  401: '认证失败，无法访问系统资源',
  403: '当前操作没有权限',
  404: '访问资源不存在',
  default: '系统未知错误，请反馈给管理员'
}

const loadingInstance = null

const service = axios.create({
  timeout: 10000, // 设置超时时间10s
  baseURL: import.meta.env.VITE_APP_BASE_API
  // 配置项
})
service.interceptors.request.use(
  config => {
    // 登录流程控制中，根据本地是否存在token判断用户的登录情况
    // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token
    // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码
    // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = 'Bearer ' + token // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    // if (config.method === 'get' && config.params) {
    //   let url = config.url + '?' + tansParams(config.params)
    //   url = url.slice(0, -1)
    //   config.params = {}
    //   config.url = url
    // }
    return config
  },
  error => {
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200
    // 获取错误信息
    const msg = errorCode[code] || res.data.msg || errorCode.default
    // 二进制数据则直接返回
    if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
      return res.data
    }
    switch (code) {
      // 401: 未登录状态，跳转登录页
      case 401:
        console.log(msg)
        break
        // 403 token过期
        // 清除token并跳转登录页
      case 403:
        console.log(msg)
        localStorage.removeItem('token')
        break
        // 404请求不存在
      case 404:
        console.log('请求的资源不存在')
        break
      case 500:
        console.log(msg)
        return res.data
      default:
        return res.data
    }
  },
  (error) => {
    console.log('err' + error)
    let { message } = error
    if (message === 'Network Error') {
      message = '后端接口连接异常'
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.substr(message.length - 3) + '异常'
    }
    loadingInstance.close()
    return Promise.reject(error)
  }
)

export default service
